package matriz;

import java.util.ArrayList;
import java.util.Hashtable;

public class Matriz {

    private Hashtable<Integer, Float> mat;
    private int tamanioX;
    private int tamanioY;
    
    public Matriz(int tamX, int tamY)
    {
        tamanioX = tamX;
        tamanioY = tamY;
        mat = new Hashtable<Integer, Float>();
    }
    
    public Matriz(int tamX, int tamY, ArrayList<Float> valores)
    {
        tamanioX = tamX;
        tamanioY = tamY;
        mat = new Hashtable<Integer, Float>();
        for(int i = 0; i < valores.size(); i++)
        {
            mat.put(i, valores.get(i));
        }
    }
    
    public void agregarValor(int x, int y, float value)
    {
        mat.put(x*tamanioY+y, value);
    }
    
    public float obtenerValor(int x, int y)
    {
        if(mat.containsKey(x*tamanioY+y))
        {
            return mat.get(x*tamanioY+y);
        }
        else
        {
            if(x == y)
            {
                return 1f;
            }
        }
        return 1f/(mat.get(y*tamanioY+x));
    }

    public ArrayList<Float> obtenerVectorPrioridad()
    {
        // Guarda las sumas de las columnas (para normalizar)
        ArrayList<Float> sumaCol = new ArrayList<Float>();
        
        // Recorre la matriz sumando por columnas
        for(int j = 0; j < tamanioY; j++)
        {
            float sum = 0;
            for(int i = 0; i < tamanioX; i++)
            {
                sum += obtenerValor(i, j);
            }
            sumaCol.add(j, sum);
        }
        
        // Guarda el promedio de cada fila
        ArrayList<Float> vectorPrioridad = new ArrayList<Float>();
        
        // Recorremos la matriz por filas sumando los valores normalizados y promediamos
        for(int i = 0; i < tamanioX; i++)
        {
            float sum = 0;
            for(int j = 0; j < tamanioY; j++)
            {
                sum += obtenerValor(i, j)/(sumaCol.get(j));
            }
            vectorPrioridad.add(i, (sum/tamanioY));
        }
        return vectorPrioridad;
    }
    
    public ArrayList<Float> multiplicarPorVector(ArrayList<Float> vectorM)
    {
        ArrayList<Float> resultado = new ArrayList<Float>();
        for(int i = 0; i < tamanioX; i++)
        {
            float suma = 0f;
            for(int j = 0; j < tamanioY; j++)
            {
                suma += obtenerValor(j,i)*vectorM.get(j);
            }
            resultado.add(suma);
        }
        return resultado;
    }
    
    public void mostrarMatriz()
    {
        for (int x = 0; x < tamanioX; x++)
        {
            System.out.print("[");
            for (int y = 0; y < tamanioY; y++ )
                System.out.print(obtenerValor(x,y) + ",");
            System.out.println("]");
        }
    }
}